#pragma once

#include <string>
#include <vector>


struct FilmSessionBoxModule
{
    std::string                     myMediuType;
    std::string                     myFilmDestination;
    std::string                     myNumberofCopies;
    std::string                     myFilmPriority;
};

struct FilmBoxModule
{
    int                             myFilmBoxNumber;
    std::string                     myImageDisplayFormat;
    std::string                     myFilmSizeID;
    std::string                     myFilmOrientation;
    std::string                     myMagnificationType;
    std::string                     myRequestedResolutionID;
    std::string                     myAnnotationDisplayFormatID;
    unsigned short                  myIllumination;
    unsigned short                  myReflectedAmbientLight;
    unsigned short                  myMaxDensity;
    unsigned short                  myMinDensity;
};

struct ImageBoxModule
{
    unsigned short                  myImageBoxPosition;
    unsigned short                  mySamplesPerPixel;
    unsigned short                  myPixelRepresentation;
    unsigned short                  myRows;
    unsigned short                  myColumns;
    unsigned short                  myBitsAllocated;
    std::string                     myPhotometricInterpretation;
    std::string                     myPixelAspectRatio;
    char*                           myPixelData;
};

struct AnnotationBoxModule
{
    unsigned short                  myAnnotationPosition;
    std::string                     myTextString;
};

struct PrinterModule
{
    std::string                     myPrinterStatus;
    std::string                     myPrinterStatusInfo;
    std::string                     myPrinterName;
    std::string                     myManufacturer;
    std::string                     myManufacturerModelName;
    std::string                     myDeviceSerialNumber;
    std::string                     mySoftwareVersions;
    std::string                     myDateOfLastCalibration;
    std::string                     myTimeOfLastCalibration;
};

struct PrinterConfigurationModule
{
    std::string                     mySOPClassesSupported;
    std::string                     myMaximumMemoryAllocation;
    std::string                     myMediumType;
    std::string                     myFilmSizeID;
    unsigned short                  myMemoryBitDepth;
    unsigned short                  myPrintingBitDepth;
    unsigned short                  myMaxDensity;
    unsigned short                  myMinDensity;

    std::string                     myOtherMediumType;
    std::string                     myOtherFilmSizeID;
    unsigned short                  myOtherMaxDensity;
    unsigned short                  myOtherMinDensity;

    unsigned short                  myRows;
    unsigned short                  myColumns;
    std::string                     myImageDisplayFormat;
    std::string                     myFilmOrientation;
    std::string                     myImageFilmSizeID;
    std::string                     myPrinterResolutionID;
    std::string                     myPrinterPixelSpacing;
    std::string                     myRequestedImageSizeFlag;
    std::string                     myDefaultPrinterResolutionID;
    std::string                     myDefaultMagnificationType;
    std::string                     myOtherMagnificationTypesAvailable;
    std::string                     myDefaultSmoothingType;
    std::string                     myOtherSmoothingTypesAvailable;
    std::string                     myConfigurationInformationDescription;
    std::string                     myMaximumCollatedFilms;
    std::string                     myDecimateCropResult;
    std::string                     myManufacturer;
    std::string                     myManufacturerModelName;
    std::string                     myPrinterName;
};

struct PrintJobModule
{
    std::string                     myExecutionStatus;
    std::string                     myExecutionStatusInfo;
    std::string                     myCreationDate;
    std::string                     myCreationTime;
    std::string                     myPrintPriority;
    std::string                     myOriginator;
    std::string                     myPrinterName;
};

struct PresentationLUTModule
{
    unsigned short*                 myLUTDescriptor;
    unsigned short*                 myLUTData;
    std::string                     myPresentationLUTShape;
};

struct HeaderInfo
{
    int                             myWidthNum;
    int                             myHeightNum;
    int                             myImageHeight;
    int                             myImageWidth;

    std::string                     myPatientName;
    std::string                     myPatientID;
    std::string                     myPatientSex;
    std::string                     myPatientAge;
    std::string                     myPageNumber;
};

enum class CVType
{
    cv_16UC1 = 0,
    cv_8UC3 = 1
};

struct CornerInfoV
{
    std::vector<std::string>        myLeftTop;
    std::vector<std::string>        myRightTop;
    std::vector<std::string>        myLeftBottom;
    std::vector<std::string>        myRightBottom;
    std::vector<std::string>        myLeftCenter;
    std::vector<std::string>        myRightCenter;
    std::vector<std::string>        myTopCenter;
    std::vector<std::string>        myBottomCenter;
};

struct ImageParameter
{
    unsigned short                  myRows;
    unsigned short                  myColumns;
    void*                           myPixelData;
    double                          myWindowsWidth;
    double                          myWindowsCenter;
    double                          myPixelSpacingY;
};
